iT邦幫忙

2025 iThome 鐵人賽

DAY 16
0

繼連續兩天的 map 跟 set,今天來談 Symbol

Symbol

Symbol 有以下幾個特點

  • Symbol 是原始值(primitive type value)
  • 保證其唯一性,即使用相同敘述來建立 Symbol,也不會是同個 Symbol
  • 不是可枚舉性(non-enumerable)的值,所以從 Object.keys(), Object.entries(), for..in 都看不到 Symbol
  • 可用於建立唯一的屬性名稱但又不會與其他屬性衝突的情況,換句話說,Symbol 適合用在物件上作為不公開的屬性/方法
  • 必須知道其 Symbol 才能 access 該 Symbol 上的屬性值

建立 Symbol

於 js 中建立 Symbol 的語法是 Symbol()
務必不要寫成 new Symbol()

Symbol 有唯一性,即使用相同敘述建立的 Symbol 也不會相等

let sym = Symbol("name");
console.log(sym === Symbol("name")); // false

建立 Symbol 與 access Symbol

class Rabbit{
    constructor(type){
        this.type = type;
    }
    speak(line) {
        console.log(`${this.type} rabbit says '${line}'`);
    }
}

let secretName = Symbol("secretName");


let blackRabbit = new Rabbit('black');
blackRabbit[secretName] = 'Blackie';
Object.entries(blackRabbit); // ["type" "black"] 看不見 secretName 的值
console.log(blackRabbit[secretName]); // 'Blackie' 要知道確切的 Symbol 才能 access value

let secretRole = Symbol("secretRole"); 
// symbol 也可以作為方法的 property name
blackRabbit[secretRole] = function () {
    alert("I'm a killer rabbit!");
};

blackRabbit[secretRole](); // call method with property symbol

取得物件上的 Symbol 值

Object.getOwnPropertySymbols(nameOfObject) 可取得 object 上的 symbol property
預設上物件沒有 symbol property,因此會是 empty array

console.log(Object.getOwnPropertySymbols(blackRabbit)); //  [Symbol(name), Symbol(secretRole)]

上一篇
Chapter 6 物件的秘密(Set/Polymorphism)-day15
系列文
溫故而知新:Eloquent Javascript 閱讀筆記16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言